package com.GlobalPaint.app.callback;

import android.text.TextUtils;
import android.widget.Toast;

import com.google.gson.Gson;
import com.lzy.okhttputils.OkHttpUtils;

import org.json.JSONObject;

import java.lang.reflect.Type;

import okhttp3.Response;

/**
 * ================================================
 * 作    者：廖子尧
 * 版    本：1.0
 * 创建日期：2016/1/14
 * 描    述：默认将返回的数据解析成需要的Bean,可以是 BaseBean，String，List，Map
 * 修订历史：
 * ================================================
 */
public abstract class JsonCallback<T> extends EncryptCallback<T> {

    private Class<T> clazz;
    private Type type;

    public JsonCallback(Class<T> clazz) {
        this.clazz = clazz;
    }

    public JsonCallback(Type type) {
        this.type = type;
    }
    public static final int CODE_INTERNAL_ERROR 			= -1;		// 500 internal error
    public static final int CODE_SUCCESS 					= 0;		// all success operation
    public static final int CODE_USER_NON_EXIST 			= 1;
    public static final int CODE_WRONG_PASSWORD 			= 2;
    public static final int CODE_MOBILE_REGISTERED			= 3;		// mobile had been registered
    public static final int CODE_INVALID_SMSCODE 			= 4;		// invalid sms code
    public static final int CODE_STILL_VALID 				= 5;		// last sms or auth code is still valid
    public static final int CODE_EXCEED_LIMIT 				= 6;		// exceed limit for sms request
    public static final int CODE_EXPIRED_SMSCODE 			= 7;		// expired sms code
    public static final int CODE_QRCode_EXPIRED 		    = 8;        // expired qrcode
    public static final int CODE_NO_DATA 		    		= 9;        // no data

    public static final int CODE_INVALID_PARAMS 			= 10;		// parameters are null or invalid
    public static final int CODE_USER_NO_BASIC_DATA			= 11;		//未填写基本资料
    public static final int CODE_HOUSE_STATUS_NON_VERIFY	= 12;		//尚未验证身份
    public static final int CODE_USER_LOCKED				= 13;		//用户被锁定
    public static final int CODE_ALREADY_SUBMIT				= 22;       //已提交资料，请勿重复提交
    public static final int CODE_CONTENT_NOT_MATCH			= 23;       //提交内容不匹配

    public static final int CODE_ALREADY_REMINDERS			= 50; 		//时间限制内已催单
    public static final int CODE_ALREADY_EVALUATED			= 99;		//已评价过，请勿重复评价

    //该方法是子线程处理，不能做ui相关的工作
    @Override
    public T parseNetworkResponse(Response response) throws Exception {
        String responseData = response.body().string();
        /**
         * 设置自己的自定义回调
         *
         */

        if (clazz != null) {
            JSONObject jsonObject = new JSONObject(responseData);
            int code = jsonObject.optInt("errCode",1001);
            if (code == 1001) {
                code  = jsonObject.optInt("code",1001);
            }
            if(code == 1001) {
                code = -2;
            }
            if (code != -2){
                switch (code) {
                    case CODE_INTERNAL_ERROR:
                      //  makeErrorToast(code,"服务器繁忙,请稍后在试");
                        break;
                    case CODE_USER_NON_EXIST:
                     //   makeErrorToast(code,"用户不存在");
                        break;
                    case CODE_WRONG_PASSWORD:
                    //    makeErrorToast(code,"密码错误");
                        break;
                    /*case CODE_MOBILE_REGISTERED:
                        makeErrorToast(code,"手机号已经被注册");
                        break;*/
                    case CODE_INVALID_SMSCODE:
                        makeErrorToast(code,"无效的验证码");
                        break;
                    case CODE_STILL_VALID:
                        makeErrorToast(code,"最后一个短信或身份验证代码仍然是有效的");
                        break;
                    case CODE_EXCEED_LIMIT:
                        makeErrorToast(code,"超过限制短信请求");
                        break;
                    case CODE_EXPIRED_SMSCODE:
                        makeErrorToast(code,"过期的短信代码");
                        break;
                    case CODE_QRCode_EXPIRED:
                        makeErrorToast(code,"过期qrcode");
                        break;
                   /* case CODE_NO_DATA:
                        makeErrorToast(code,"没有数据");
                        break;*/
                    case CODE_INVALID_PARAMS:
                        makeErrorToast(code,"参数是null或无效");
                        break;
                    case CODE_USER_NO_BASIC_DATA:
//                        makeErrorToast(code,"未填写基本资料");
                       /* OkHttpUtils.getInstance().getDelivery().post(new Runnable() {
                        @Override
                        public void run() {
                            Intent intent = new Intent(App.context, CompleteInfoActivity.class);
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            intent.putExtra("complete",100101);
                            App.context.startActivity(intent);
                        }
                    });*/
                        break;
                    case CODE_HOUSE_STATUS_NON_VERIFY:
//                        makeErrorToast(code,"尚未验证身份");
                      /*  OkHttpUtils.getInstance().getDelivery().post(new Runnable() {
                            @Override
                            public void run() {
                                Intent intent = new Intent(App.context, Yanzheng.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                intent.putExtra("complete", 100101);
                                App.context.startActivity(intent);
                            }
                        });*/


                        break;
                    case CODE_USER_LOCKED:
                        makeErrorToast(code,"用户被锁定");
                        break;
                    case CODE_ALREADY_SUBMIT:
                        makeErrorToast(code,"已提交资料，请勿重复提交");
                        break;
                    case CODE_CONTENT_NOT_MATCH:
                        makeErrorToast(code,"提交内容不匹配");
                        break;
                    case CODE_ALREADY_REMINDERS:
                        makeErrorToast(code,"时间限制内已催单");
                        break;
                    case CODE_ALREADY_EVALUATED:
                        makeErrorToast(code,"已评价过，请勿重复评价");
                        break;
                    case 14:
                        makeErrorToast(code,"此联系人已绑定该学生");
                        break;
                }
            }
        }


        if (TextUtils.isEmpty(responseData)) return null;
        if (clazz == String.class) return (T) responseData;
        if (clazz != null) return new Gson().fromJson(responseData, clazz);
        if (type != null) return new Gson().fromJson(responseData, type);



        /**
         * 一般来说，服务器返回的响应码都包含 code，msg，data 三部分，在此根据自己的业务需要完成相应的逻辑判断
         * 以下只是一个示例，具体业务具体实现
         *//*
        JSONObject jsonObject = new JSONObject(responseData);
        final String msg = jsonObject.optString("msg", "");
        final int code = jsonObject.optInt("code", 0);
        String data = jsonObject.optString("data", "");
        switch (code) {
            case 0:
                *//**
         * code = 0 代表成功，默认实现了Gson解析成相应的实体Bean返回，可以自己替换成fastjson等
         * 对于返回参数，先支持 String，然后优先支持class类型的字节码，最后支持type类型的参数
         *//*
                if (clazz == String.class) return (T) data;
                if (clazz != null) return new Gson().fromJson(data, clazz);
                if (type != null) return new Gson().fromJson(data, type);
                break;
            case 104:
                //比如：用户授权信息无效，在此实现相应的逻辑，弹出对话或者跳转到其他页面等,该抛出错误，会在onError中回调。
                throw new IllegalStateException("用户授权信息无效");
            case 105:
                //比如：用户收取信息已过期，在此实现相应的逻辑，弹出对话或者跳转到其他页面等,该抛出错误，会在onError中回调。
                throw new IllegalStateException("用户收取信息已过期");
            case 106:
                //比如：用户账户被禁用，在此实现相应的逻辑，弹出对话或者跳转到其他页面等,该抛出错误，会在onError中回调。
                throw new IllegalStateException("用户账户被禁用");
            case 300:
                //比如：其他乱七八糟的等，在此实现相应的逻辑，弹出对话或者跳转到其他页面等,该抛出错误，会在onError中回调。
                throw new IllegalStateException("其他乱七八糟的等");
            default:
                throw new IllegalStateException("错误代码：" + code + "，错误信息：" + msg);
        }
        //如果要更新UI，需要使用handler，可以如下方式实现，也可以自己写handler
        OkHttpUtils.getInstance().getDelivery().post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(OkHttpUtils.getContext(), "错误代码：" + code + "，错误信息：" + msg, Toast.LENGTH_SHORT).show();
            }
        });*/
        return null;
    }

    private void makeErrorToast(final int code, final String msg) {
        OkHttpUtils.getInstance().getDelivery().post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(OkHttpUtils.getContext(), msg, Toast.LENGTH_SHORT).show();
            }
        });
    }


}
